home *** CD-ROM | disk | FTP | other *** search
-
- CA-89:01
- CERT Advisory
- January 1989
- Passwd hole
- -----------------------------------------------------------------------------
-
- The CERT center received the following information from Keith Bostic
- from the Computer Systems Research Group at UC-Berkeley on Dec. 21, 1988.
- This patch has also been posted to comp.bugs.4bsd.ucb-fixes.
-
- Please note that this patch will only work with BSD 4.3. If you have
- 4.2 please let me know and I will forward the correct patch.
-
- -----------------------------------------------------------------------------
-
- Ed DeHart
- Computer Emergency Response Team (CERT)
- Software Engineering Institute
- Carnegie Mellon University
- Pittsburgh, PA 15213-3890
-
- Internet: cert@cert.sei.cmu.edu
- Telephone: 412-268-7090 24-hour hotline: CERT personnel answer
- 7:30a.m.-6:00p.m. EST, on call for
- emergencies other hours.
-
- Past advisories and other information are available for anonymous ftp
- from cert.sei.cmu.edu (192.88.209.5).
-
-
-
-
- Subject: security problem in passwd
- Index: bin/passwd.c 4.3BSD
-
- Description:
- There's a security problem associated with the passwd(1)
- program in all known Berkeley systems. This problem is
- also in most Berkeley derived systems, see your vendor
- for more information.
-
- Fix:
- Apply the following patch to the file src/bin/passwd.c and
- recompile/reinstall it.
-
- *** passwd.c.orig Wed Dec 21 08:57:41 1988
- --- passwd.c Wed Dec 21 09:00:25 1988
- ***************
- *** 332,337 ****
- --- 332,339 ----
- return (crypt(pwbuf, saltc));
- }
-
- + #define STRSIZE 100
- +
- char *
- getloginshell(pwd, u, arg)
- struct passwd *pwd;
- ***************
- *** 338,344 ****
- int u;
- char *arg;
- {
- ! static char newshell[BUFSIZ];
- char *cp, *valid, *getusershell();
-
- if (pwd->pw_shell == 0 || *pwd->pw_shell == '\0')
- --- 340,346 ----
- int u;
- char *arg;
- {
- ! static char newshell[STRSIZE];
- char *cp, *valid, *getusershell();
-
- if (pwd->pw_shell == 0 || *pwd->pw_shell == '\0')
- ***************
- *** 415,423 ****
- getfingerinfo(pwd)
- struct passwd *pwd;
- {
- ! char in_str[BUFSIZ];
- struct default_values *defaults, *get_defaults();
- ! static char answer[4*BUFSIZ];
-
- answer[0] = '\0';
- defaults = get_defaults(pwd->pw_gecos);
- --- 417,425 ----
- getfingerinfo(pwd)
- struct passwd *pwd;
- {
- ! char in_str[STRSIZE];
- struct default_values *defaults, *get_defaults();
- ! static char answer[4*STRSIZE];
-
- answer[0] = '\0';
- defaults = get_defaults(pwd->pw_gecos);
- ***************
- *** 429,435 ****
- */
- do {
- printf("\nName [%s]: ", defaults->name);
- ! (void) fgets(in_str, BUFSIZ, stdin);
- if (special_case(in_str, defaults->name))
- break;
- } while (illegal_input(in_str));
- --- 431,437 ----
- */
- do {
- printf("\nName [%s]: ", defaults->name);
- ! (void) fgets(in_str, STRSIZE, stdin);
- if (special_case(in_str, defaults->name))
- break;
- } while (illegal_input(in_str));
- ***************
- *** 440,446 ****
- do {
- printf("Room number (Exs: 597E or 197C) [%s]: ",
- defaults->office_num);
- ! (void) fgets(in_str, BUFSIZ, stdin);
- if (special_case(in_str, defaults->office_num))
- break;
- } while (illegal_input(in_str) || illegal_building(in_str));
- --- 442,448 ----
- do {
- printf("Room number (Exs: 597E or 197C) [%s]: ",
- defaults->office_num);
- ! (void) fgets(in_str, STRSIZE, stdin);
- if (special_case(in_str, defaults->office_num))
- break;
- } while (illegal_input(in_str) || illegal_building(in_str));
- ***************
- *** 452,458 ****
- do {
- printf("Office Phone (Ex: 6426000) [%s]: ",
- defaults->office_phone);
- ! (void) fgets(in_str, BUFSIZ, stdin);
- if (special_case(in_str, defaults->office_phone))
- break;
- remove_hyphens(in_str);
- --- 454,460 ----
- do {
- printf("Office Phone (Ex: 6426000) [%s]: ",
- defaults->office_phone);
- ! (void) fgets(in_str, STRSIZE, stdin);
- if (special_case(in_str, defaults->office_phone))
- break;
- remove_hyphens(in_str);
- ***************
- *** 464,470 ****
- */
- do {
- printf("Home Phone (Ex: 9875432) [%s]: ", defaults->home_phone);
- ! (void) fgets(in_str, BUFSIZ, stdin);
- if (special_case(in_str, defaults->home_phone))
- break;
- remove_hyphens(in_str);
- --- 466,472 ----
- */
- do {
- printf("Home Phone (Ex: 9875432) [%s]: ", defaults->home_phone);
- ! (void) fgets(in_str, STRSIZE, stdin);
- if (special_case(in_str, defaults->home_phone))
- break;
- remove_hyphens(in_str);
- ***************
- *** 501,507 ****
- if (input_str[length-1] != '\n') {
- /* the newline and the '\0' eat up two characters */
- printf("Maximum number of characters allowed is %d\n",
- ! BUFSIZ-2);
- /* flush the rest of the input line */
- while (getchar() != '\n')
- /* void */;
- --- 503,509 ----
- if (input_str[length-1] != '\n') {
- /* the newline and the '\0' eat up two characters */
- printf("Maximum number of characters allowed is %d\n",
- ! STRSIZE-2);
- /* flush the rest of the input line */
- while (getchar() != '\n')
- /* void */;
-